/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.uniceub.fsw.testes.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.testes.dao.CasoTesteDAO;
import br.uniceub.fsw.testes.dao.ErroDAO;
import br.uniceub.fsw.testes.dao.LocalizacaoErroDAO;
import br.uniceub.fsw.testes.dao.SeveridadeDAO;
import br.uniceub.fsw.testes.dao.TipoTesteDAO;
import br.uniceub.fsw.testes.vo.CasoTesteVO;
import br.uniceub.fsw.testes.vo.ErroVO;
import br.uniceub.fsw.testes.vo.LocalizacaoErroVO;
import br.uniceub.fsw.testes.vo.SeveridadeVO;
import br.uniceub.fsw.testes.vo.TipoTesteVO;
import br.uniceub.fsw.util.Html;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author Gabriel
 */
public class ErroFacade {

    CasoTesteDAO casoDAO = new CasoTesteDAO();
    TipoTesteDAO tipoDAO = new TipoTesteDAO();
    SeveridadeDAO sevDAO = new SeveridadeDAO();
    LocalizacaoErroDAO locDAO = new LocalizacaoErroDAO();
    ErroDAO erroDAO = new ErroDAO();
    Html montarHtml = new Html();

    /**
     * Monta o código HTML da página de inclusão de erro
     * @param req
     * @return
     */
    public String montarIncluirErro(HttpServletRequest req) {
        CasoTesteVO casoVO = new CasoTesteVO();
        TipoTesteVO tipoVO = new TipoTesteVO();
        SeveridadeVO sevVO = new SeveridadeVO();
        List<SeveridadeVO> listaSeveridadeVO = new ArrayList();
        LocalizacaoErroVO locVO = new LocalizacaoErroVO();
        List<LocalizacaoErroVO> listaLocalizacaoErroVO = new ArrayList();
        casoVO = casoDAO.consultarPorId(Integer.parseInt(req.getParameter("idCasoTeste")));
        tipoVO = tipoDAO.consultarPorId(casoVO.getCdTipoTeste());
        listaSeveridadeVO = sevDAO.consultarPorExemplo(sevVO);
        listaLocalizacaoErroVO = locDAO.consultarPorExemplo(locVO);
        StringBuffer sb = new StringBuffer();
        sb.append("<TABLE>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Código do Caso:</TD>\n");
        sb.append("<TD>" + casoVO.getIdCasoTeste() + "</TD>\n");
        sb.append("<input type='hidden' name='idCasoTeste' value='" + casoVO.getIdCasoTeste() + "' >");
        sb.append("<TD>Nome do Caso:</TD>");
        sb.append("<TD>" + casoVO.getNoCasoTeste() + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Tipo de Teste:</TD>\n");
        sb.append("<TD>" + tipoVO.getNoTipoTeste() + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>");
        sb.append("<TD>Severidade:</TD>");
        sb.append("<TD>" + montarHtml.criarComboBox(listaSeveridadeVO, "idSeveridade", "noSeveridade", 0) + "</TD>");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Localização do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarComboBox(listaLocalizacaoErroVO, "idLocalizacaoErro", "noLocalizacaoErro", 0) + "</TD");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Nome do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarInput("noErro", "") + "</TD>");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Descrição do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarInput("dsErro", "") + "</TD>");
        sb.append("</TR>");
        sb.append("</TABLE>");

        return sb.toString();
    }

    /**
     * Inclui no banco de dados um novo registro de erro para o caso de teste
     * @param req
     */
    public void incluirErro(HttpServletRequest req) {
        ErroVO erroVO = new ErroVO();
        erroVO.setCdCasoTeste(Integer.parseInt(req.getParameter("idCasoTeste")));
        erroVO.setCdLocalizacaoErro(Integer.parseInt(req.getParameter("idLocalizacaoErro")));
        erroVO.setCdSeveridade(Integer.parseInt(req.getParameter("idSeveridade")));
        erroVO.setDsErro(req.getParameter("dsErro"));
        erroVO.setNoErro(req.getParameter("noErro"));
        try {
            Transacao.iniciar();
            erroDAO.inserir(erroVO);
            Transacao.efetivar();
        } catch (Exception ex) {
            System.out.println(ex);
            Transacao.desfazer();
        }



    }

    /**
     * Gera uma lista com todos os erros vinculados a um caso de teste
     * @param req
     * @return
     */
    public String listarErro(HttpServletRequest req) {
        StringBuffer sb = new StringBuffer();
        List<ErroVO> listaErroVO = new ArrayList();
        SeveridadeVO sevVO = new SeveridadeVO();
        LocalizacaoErroVO locVO = new LocalizacaoErroVO();
        listaErroVO = erroDAO.consultarPorCdCasoTeste(Integer.parseInt(req.getParameter("idCasoTeste")));
        sb.append("<TABLE>");
        sb.append("<TR class='tituloTabela'>");
        sb.append("<TD>&nbsp;</TD>");
        sb.append("<TD>Nome</TD>");
        sb.append("<TD>Severidade</TD>");
        sb.append("<TD>Localização</TD>");
        sb.append("</TR>");
        for (int i = 0; i < listaErroVO.size(); i++) {
            locVO = locDAO.consultarPorId(listaErroVO.get(i).getCdLocalizacaoErro());
            sevVO = sevDAO.consultarPorId(listaErroVO.get(i).getCdSeveridade());
            if (i % 2 == 0) {
                sb.append("<TR>\n");
            } else {
                sb.append("<TR class=\"impar\">\n");
            }
            sb.append("<input class='radio' type='radio' name='idErro' value='" + listaErroVO.get(i).getIdErro() + "'/></TD>");
            sb.append("<TD>" + listaErroVO.get(i).getNoErro() + "</TD>");
            sb.append("<TD>" + sevVO.getNoSeveridade() + "</TD>");
            sb.append("<TD>" + locVO.getNoLocalizacaoErro() + "</TD>");
            sb.append("</TR>");
        }
        sb.append("</TABLE>");
        return sb.toString();
    }

    /**
     * Monta o código HTML da página de alteração de erro
     * @param req
     * @return
     */
    public String montarAlterarErro(HttpServletRequest req) {
        StringBuffer sb = new StringBuffer();
        ErroVO erroVO = new ErroVO();
        CasoTesteVO casoVO = new CasoTesteVO();
        TipoTesteVO tipoVO = new TipoTesteVO();
        SeveridadeVO sevVO = new SeveridadeVO();
        List<SeveridadeVO> listaSeveridadeVO = new ArrayList();
        LocalizacaoErroVO locVO = new LocalizacaoErroVO();
        List<LocalizacaoErroVO> listaLocalizacaoErroVO = new ArrayList();
        casoVO = casoDAO.consultarPorId(Integer.parseInt(req.getParameter("idCasoTeste")));
        erroVO = erroDAO.consultarPorId(Integer.parseInt(req.getParameter("idErro")));
        tipoVO = tipoDAO.consultarPorId(casoVO.getCdTipoTeste());
        listaSeveridadeVO = sevDAO.consultarPorExemplo(sevVO);
        listaLocalizacaoErroVO = locDAO.consultarPorExemplo(locVO);
        sb.append("<TABLE>\n");
        sb.append("<input type='hidden' name='idErro' value='" + erroVO.getIdErro() + "' >");
        sb.append("<TR>\n");
        sb.append("<TD>Código do Caso:</TD>\n");
        sb.append("<TD>" + casoVO.getIdCasoTeste() + "</TD>\n");
        sb.append("<TD>Nome do Caso:</TD>");
        sb.append("<TD>" + casoVO.getNoCasoTeste() + "</TD>");
        sb.append("</TR>\n");
        sb.append("<TR>\n");
        sb.append("<TD>Tipo de Teste:</TD>\n");
        sb.append("<TD>" + tipoVO.getNoTipoTeste() + "</TD>\n");
        sb.append("</TR>\n");
        sb.append("<TR>");
        sb.append("<TD>Severidade:</TD>");
        sb.append("<TD>" + montarHtml.criarComboBox(listaSeveridadeVO, "idSeveridade", "noSeveridade", erroVO.getCdSeveridade()) + "</TD>");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Localização do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarComboBox(listaLocalizacaoErroVO, "idLocalizacaoErro", "noLocalizacaoErro", erroVO.getCdLocalizacaoErro()) + "</TD");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Nome do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarInput("noErro", erroVO.getNoErro()) + "</TD>");
        sb.append("</TR>");
        sb.append("<TR>");
        sb.append("<TD>Descrição do Erro:</TD>");
        sb.append("<TD>" + montarHtml.criarInput("dsErro", erroVO.getDsErro()) + "</TD>");
        sb.append("</TR>");
        sb.append("</TABLE>");
        return sb.toString();
    }

    /**
     * Altera no bacno de dados o erro selecionado
     * @param req
     */
    public void alterarErro(HttpServletRequest req) {
        ErroVO erroVO = new ErroVO();
        erroVO = erroDAO.consultarPorId(Integer.parseInt(req.getParameter("idErro")));
        erroVO.setCdLocalizacaoErro(Integer.parseInt(req.getParameter("idLocalizacaoErro")));
        erroVO.setCdSeveridade(Integer.parseInt(req.getParameter("idSeveridade")));
        erroVO.setDsErro(req.getParameter("dsErro"));
        erroVO.setNoErro(req.getParameter("noErro"));
        try {
            Transacao.iniciar();
            erroDAO.alterar(erroVO);
            Transacao.efetivar();
        } catch (Exception ex) {
            System.out.println(ex);
            Transacao.desfazer();
        }


    }

    /**
     * Exclui do banco de dados o erro selecionado
     * @param req
     */
    public void excluirErro(HttpServletRequest req) {
        ErroVO erroVO = new ErroVO();
        erroVO = erroDAO.consultarPorId(Integer.parseInt(req.getParameter("idErro")));
        try {
            Transacao.iniciar();
            erroDAO.excluir(erroVO);
            Transacao.efetivar();
        } catch (Exception ex) {
            System.out.println(ex);
            Transacao.desfazer();
        }

    }
}
